package com.study.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


import java.io.IOException;
import java.net.URI;

/**
 * 1.和HDFS建立连接
 * 2.调用API完成具体功能
 * 3.关闭连接
 */
public class HdfsClientTest {
    private FileSystem fs;

    /**
     *   判断文件或目录
     * * @param   path   文件路径
     */
    @Test
    public void testListStatus() throws IOException {
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus status : listStatus) {
            if (status.isDirectory()){
                System.out.println("Dir:"+status.getPath().getName());
            }else {
                System.out.println("File:"+status.getPath().getName());

            }
        }
    }

    /**
     *  查看文件详情
     * * @param f          文件路径
     * * @param recursive  是否递归查看
     */
    @Test
    public void testListFiels() throws IOException {
        RemoteIterator<LocatedFileStatus> listFiles =
                fs.listFiles(new Path("/"), true);
        while (listFiles.hasNext()){
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("文件名："+fileStatus.getPath().getName());
            System.out.println("块大小："+fileStatus.getBlockSize());
            System.out.println("副本数："+fileStatus.getReplication());
            System.out.println("权限信息："+fileStatus.getPermission());
        }
    }


    /**
     * 文件的重命名或者移动
     * *@param src 文件原路径
     * *@param dst 文件新路径
     */
    @Test
    public void testRename() throws IOException {
//        fs.rename(
//                new Path("/test_client/demowc.txt"),
//                new Path("/test_client_mv"));
        fs.rename(
                new Path("/test_client_mv/demowc.txt"),
                new Path("/test_client_mv/demowc_newname.txt"));
    }

    /**
     * 删除文件
     * * @param f         删除路径
     * * @param recursive 是否递归
     */
    @Test
    public void testDelete() throws IOException {
        fs.delete(new Path("/test_client"),true);
    }

    /**
     * 下载文件
     * *@param delSrc     是否删除HDFS文件
     * *@param srcs       HDFS路径
     * *@param dst        本地路径
     * *@param useRawLocalFileSystem 是否只下载该文件，不包括校验值
     */
    @Test
    public void testCopyToLocal() throws IOException {
        fs.copyToLocalFile(false,
                new Path("/test_client/demowc.txt"),
                new Path("D:\\hadoopbook"),
                false);
    }

    /**
     * 上传文件
     * *@param delSrc     是否删除本地文件
     * *@param overwrite  是否覆盖HDFS文件
     * *@param srcs       本地路径
     * *@param dst        HDFS路径
     *
     * 测试优先级：Configuration>hdfs.site.xml>hdfs.default.xml
     */
    @Test
    public void testCopyFromLocal() throws IOException {
        fs.copyFromLocalFile(false,true,
                new Path("D:\\hadoopbook\\demowc.txt"),
                new Path("/test_client"));
    }

    /**
     * 获取FileSystem对象
     * @throws IOException
     * @throws InterruptedException
     */
    @Before
    public void init() throws IOException, InterruptedException {
        //HDFS的访问路径：hdfs://hadoop102:9820
        URI uri = URI.create("hdfs://hadoop102:9820");
        //配置对象
        Configuration conf = new Configuration();
        conf.set("dfs.replication","2");
        //操作的用户：ljh
        String user="ljh";
        //获取HDFS客户端连接对象
        fs = FileSystem.get(uri, conf, user);
    }

    /**
     * 关闭资源
     * @throws IOException
     */
    @After
    public void close() throws IOException {
        fs.close();
    }

    /**
     * 1.获取HDFS客户端连接对象
     * *@param uri   HDFS的访问路径：hdfs://hadoop102:9820
     * *@param conf  配置对象
     * *@param user  操作的用户：ljh
     */
    @Test
    public void testCreateHdfsClient() throws IOException, InterruptedException {
        //HDFS的访问路径：hdfs://hadoop102:9820
        URI uri = URI.create("hdfs://hadoop102:9820");
        //配置对象
        Configuration conf = new Configuration();
        //操作的用户：ljh
        String user="ljh";
        //获取HDFS客户端连接对象
        FileSystem fileSystem = FileSystem.get(uri, conf, user);
        System.out.println(fileSystem.getClass().getName());
        //关闭连接
        fileSystem.close();
    }

}
